/**
 * JDPreferences.java	01/02/2012
 */

package l3.info.Projet.Serveur;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import l3.info.Projet.Utilitaires.Configuration;
import l3.info.Projet.Utilitaires.Chiffrement;

/**
 * Fenêtre modale pour configuration du client
 * @author Loïc Martinez
 * @version 1.0
 */

public class JDPreferencesServeur extends JDialog implements ActionListener {

    /** Constantes */
    private static final String TITRE = "Préférences";
    private static final String OK = "OK";
    private static final String ANNULER = "Annuler";
    private static final int LARGEUR = 290;
    private static final int HAUTEUR = 190;
    private static final int ABSCISSE = 480;
    private static final int ORDONNEE = 280;

    /** Composants de la JDialog */
    private JLabel labelBD, labelUsername, labelPassword, labelPort;
    private JTextField textFieldBD, textFieldUsername, textFieldPort;
    private JButton valider, annuler;
    private JPanel firstPan, panLabel, panBouton;
    private JPasswordField textFieldPassword;


    /** Permet de charger et de modifier la configuration
     * dans le fichier texte serveurPreferences.properties
     */
    private Configuration conf;

    /**
     * Constructeur
     * @param erreur, le message à afficher
     */
    public JDPreferencesServeur(Configuration conf) {
        this.conf = conf;
        setProperties();
        addComponents(FlowLayout.CENTER);
        loadConfiguration();
        setEnter();
        setVisible(true);
    }

    /**
     * Configuration des propriétés de la JFrame
     */
    private void setProperties() {
        setTitle(TITRE);
        setBounds(ABSCISSE, ORDONNEE, LARGEUR, HAUTEUR);
        setResizable(false);
        setModal(true);
        getContentPane().setLayout(new FlowLayout());
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        firstPan = new JPanel(new FlowLayout());
        firstPan.setPreferredSize(new Dimension(LARGEUR, 5));
        add(firstPan);
    }

    /**
     * Ajout du label et du bouton
     * @param alignement, la position des éléments
     * @param erreur, la valeur du JLabel
     */
    private void addComponents(int alignement) {
        panLabel = new JPanel(new FlowLayout(alignement));
        panLabel.setPreferredSize(new Dimension(LARGEUR, 100));
        labelBD = new JLabel("Base de données ");

        textFieldBD = new JTextField(10);

        panLabel.add(labelBD);
        panLabel.add(textFieldBD);

        labelUsername = new JLabel("Nom d'utilisateur " + " ");
        textFieldUsername = new JTextField(10);

        panLabel.add(labelUsername);
        panLabel.add(textFieldUsername);

        labelPassword = new JLabel("Mot de passe " + "       ");
        textFieldPassword = new JPasswordField(10);

        panLabel.add(labelPassword);
        panLabel.add(textFieldPassword);

        labelPort = new JLabel("Port BD" + "                   ");
        textFieldPort = new JTextField(10);

        panLabel.add(labelPort);
        panLabel.add(textFieldPort);

        add(panLabel);

        panBouton = new JPanel(new FlowLayout(alignement));
        panBouton.setPreferredSize(new Dimension(LARGEUR, 50));
        valider = new JButton(OK);
        valider.addActionListener(this);
        panBouton.add(valider);
        annuler = new JButton(ANNULER);
        annuler.addActionListener(this);
        panBouton.add(annuler);
        add(panBouton);
    }

    /**
     * Charge la configuration dans chaque JTextField
     */
    public void loadConfiguration() {
        textFieldBD.setText(conf.valueOf("database"));
        textFieldUsername.setText(conf.valueOf("user"));
        textFieldPassword.setText(Chiffrement.crypt(conf.valueOf("password")));
        textFieldPort.setText(conf.valueOf("port"));
    }

    /**
     * Si on appuie sur Entrée, alors ça déclenche le listener
     * du bouton bouton
     */
    public void setEnter() {
        getRootPane().setDefaultButton(valider);
    }

    /**
     * @return le nom de la base de données
     */
    public String getDatabaseName() {
        return textFieldBD.getText();
    }

    /**
     * @return le nom avec lequel on se connecte à la base de données
     */
    public String getUsername() {
        return textFieldUsername.getText();
    }

    /**
     * @return le mot de passe chiffré avec RSA
     */
    public String getPasswordMD5() {
        return Chiffrement.crypt(String.valueOf
                (textFieldPassword.getPassword()));
    }

    /**
     * @return le port de la base de données
     */
    public int getPort() {
        try {
            return Integer.parseInt(textFieldPort.getText());
        } catch (NumberFormatException ex) {
            // Retourner le port par défaut de la base de données ?
            return -1;
        }
    }

    /**
     * Permet de gérer les actions sur les ActionListeners
     */
    public void actionPerformed(ActionEvent ev) {
        if (ev.getSource() == valider) { // Ecrire avec Configuration
            // On modifie le fichier de configuration avec les valeurs entr�es
            conf.modifierValeur("database", textFieldBD.getText());
            conf.modifierValeur("user", textFieldUsername.getText());
            conf.modifierValeur("password", Chiffrement.crypt
                    (String.valueOf(textFieldPassword.getPassword())));
            conf.modifierValeur("port", textFieldPort.getText());
            setVisible(false);
            dispose();
        } else if (ev.getSource() == annuler) { // Ne rien faire
            setVisible(false);
            dispose();
        }
    }
}
